home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 April: Mac OS SDK / Dev.CD Apr 99 SDK1.toast / Development Kits / MacX25 / MacX25 Developer's Kit / X.25_Interface_Library / Library / Interfaces / PInterfaces / X25_Interface.p next >
Encoding:
Text File  |  1994-11-21  |  28.4 KB  |  474 lines  |  [TEXT/MPS ]

  1. (* ******************************************************************************************** *)
  2. (* *                                                                                           * *)
  3. (* *                              X.25 Interface Library                                      * *)
  4. (* *                              ----------------------                                      * *)
  5. (* *                                                                                           * *)
  6. (* *                                  X25_Interface.h                                         * *)
  7. (* *                                                                                           * *)
  8. (* *..........................................................................................* *)
  9. (* *                                                                                           * *)
  10. (* *     Definitions that are required in order to use the "X.25 Interface Library" set       * *)
  11. (* *     of Interface routines.                                                               * *)
  12. (* *                                                                                           * *)
  13. (* *                                                                                           * *)
  14. (* *------------------------------------------------------------------------------------------* *)
  15. (* *                                                                                           * *)
  16. (* *                     Copyright Apple Computer, Inc. 1988-89                                  * *)
  17. (* *                               All Rights Reserved                                          * *)
  18. (* *                           Apple Computer Confidential                                       * *)
  19. (* *                                                                                           * *)
  20. (* *------------------------------------------------------------------------------------------* *)
  21. (* *                                                                                           * *)
  22. (* *     Revision History:                                                                     * *)
  23. (* *                                                                                           * *)
  24. (* *     Date       Individual          Changes                                               * *)
  25. (* *     .........  ................... ..................................................    * *)
  26. (* *                                                                                           * *)
  27. (* *     05 Jul 88  D. N. Willey        Original Version                                       * *)
  28. (* *         "      Rick Holzgrafe                                                              * *)
  29. (* *     01 Mar 88 James Beninghaus     Pascal Version                                                             * *)
  30. (* *                                                                                           * *)
  31. (* *                                                                                           * *)
  32. (* ******************************************************************************************** *)
  33.  
  34.     UNIT X25_Interface;
  35.     INTERFACE
  36.  
  37.     USES Types, AppleTalk;
  38.     
  39.  CONST
  40.  
  41. (* ******************************************************************************************** *)
  42. (* *                                                                                           * *)
  43. (* *    Return Codes ( "return_code" )                                                        * *)
  44. (* *                                                                                           * *)
  45. (* ******************************************************************************************** *)
  46.  
  47. (* ............................................................................................ *)
  48. (* .                                                                                           . *)
  49. (* .    Non Errors                                                                            . *)
  50. (* .                                                                                           . *)
  51. (* ............................................................................................ *)
  52.  
  53. X25if_no_error                = $0000;    (* Good Return ( not an error )                                *)
  54. X25if_io_pending            = $0001;    (* Set while async I/O is incomplete                        *)
  55. X25if_io_would_block        = $0002;    (* Set if blocking I/O would block                            *)
  56. X25if_user_cancelled        = $0008;    (* From BlackBook etc.                                        *)
  57.  
  58. (* ............................................................................................ *)
  59. (* .                                                                                           . *)
  60. (* .    Catch All During Development                                                          . *)
  61. (* .                                                                                           . *)
  62. (* ............................................................................................ *)
  63.  
  64. X25if_generic_error            = $FFFF;    (* Error, but no futher information available                *)
  65.  
  66. (* ............................................................................................ *)
  67. (* .                                                                                           . *)
  68. (* .    User Procedure Error on Call                                                          . *)
  69. (* .                                                                                           . *)
  70. (* ............................................................................................ *)
  71.  
  72. X25if_procedure_error        = $0010;
  73. X25if_init_prior_call        = $0011;
  74. X25if_init_no_call            = $0012;
  75. X25if_vccb_prior_allocation    = $0014;
  76. X25if_vccb_no_allocation    = $0015;
  77. X25if_vccb_not_open            = $0016;
  78. X25if_server_prior_connect    = $0018;
  79. X25if_server_not_connected    = $0019;
  80. X25if_user_not_validated    = $001C;
  81.  
  82. (* ............................................................................................ *)
  83. (* .                                                                                           . *)
  84. (* .    System Detected Errors                                                                  . *)
  85. (* .                                                                                           . *)
  86. (* ............................................................................................ *)
  87.  
  88. X25if_system_error            = $0020;
  89. X25if_OS_error                = $0021;    (* status_code = actual O.S. error code            *)
  90. X25if_no_mem_alloc            = $0022;    (* status_code = mem alloc request                *)
  91.  
  92. (* ............................................................................................ *)
  93. (* .                                                                                           . *)
  94. (* .    Error on Communication to X.25 Server                                                  . *)
  95. (* .                                                                                           . *)
  96. (* ............................................................................................ *)
  97.  
  98. X25if_transmission_error    = $0030;
  99. X25if_adsp_shutdown            = $0031;
  100. X25if_ipc_shutdown            = $0032;
  101. X25if_adsp_error            = $0033;    (* status_code = adsp/driver error code            *)
  102.  
  103. (* ............................................................................................ *)
  104. (* .                                                                                           . *)
  105. (* .    Internal Consistency Checks                                                              . *)
  106. (* .                                                                                           . *)
  107. (* ............................................................................................ *)
  108.  
  109. X25if_consistency_error        = $0040;
  110. X25if_init_corrupted        = $0041;
  111. X25if_vccb_corrupted        = $0042;
  112.  
  113. (* ............................................................................................ *)
  114. (* .                                                                                           . *)
  115. (* .    Request for Support that is Not Available                                                . *)
  116. (* .                                                                                           . *)
  117. (* ............................................................................................ *)
  118.  
  119. X25if_no_support            = $0050;
  120. X25if_adsp_no_support       = $0051;    (* returned on a "X25_Server_Connect" request    *)
  121. X25if_ipc_no_support           = $0052;    (* returned on a "X25_Server_Connect" request    *)
  122.  
  123. (* ............................................................................................ *)
  124. (* .                                                                                           . *)
  125. (* .    Request for Component that is Not Available                                            . *)
  126. (* .                                                                                           . *)
  127. (* ............................................................................................ *)
  128.  
  129. X25if_service_not_avail        = $0060;
  130. X25if_mpp_not_avail           = $0061;    (* returned on a "X25_Server_Connect" request    *)
  131. X25if_dsp_not_avail           = $0062;    (* returned on a "X25_Server_Connect" request    *)
  132. X25if_ipc_not_avail           = $0063;    (* returned on a "X25_Server_Connect" request    *)
  133.  
  134. (* ............................................................................................ *)
  135. (* .                                                                                           . *)
  136. (* .    Request for X.25 Server that is Not Available                                            . *)
  137. (* .                                                                                           . *)
  138. (* ............................................................................................ *)
  139.  
  140. X25if_server_not_avail       = $0070;    (* returned on a "X25_Server_Connect" request    *)
  141.  
  142. (* ............................................................................................ *)
  143. (* .                                                                                           . *)
  144. (* .    User Validation Failure                                                                . *)
  145. (* .                                                                                           . *)
  146. (* ............................................................................................ *)
  147.  
  148. X25if_validation_failure    = $0080;    (* returned on a "X25_Server_Connect" request    *)
  149. X25if_invalid_validator_ver = $0081;    (* returned on a "X25_Server_Connect" request    *)
  150. X25if_invalid_validator_msg = $0082;    (* returned on a "X25_Server_Connect" request    *)
  151. X25if_no_validator          = $0083;    (* returned on a "X25_Server_Connect" request    *)
  152. X25if_validator_shutdown    = $0084;    (* returned on a "X25_Server_Connect" request    *)
  153. X25if_invalid_name          = $0088;    (* returned on a "X25_Server_Validate" request    *)
  154. X25if_invalid_password      = $0089;    (* returned on a "X25_Server_Validate" request    *)
  155.  
  156. (* ............................................................................................ *)
  157. (* .                                                                                           . *)
  158. (* .    I/O Errors                                                                               . *)
  159. (* .                                                                                           . *)
  160. (* ............................................................................................ *)
  161.  
  162. X25if_io_error                = $0100;
  163. X25if_io_aborted            = $0101;    (* Set in result_code of async read or write    *)
  164.                                         (* if X25_Server_Discnct was called                *)
  165. X25if_io_timeout            = $0102;    (* for synchrouous I/0 calls only                *)
  166.  
  167. (* ............................................................................................ *)
  168. (* .                                                                                           . *)
  169. (* .    Read Related                                                                            . *)
  170. (* .                                                                                           . *)
  171. (* ............................................................................................ *)
  172.  
  173. X25if_read_buffer_error       = $0110;
  174. X25if_read_nil_ptr           = $0111;
  175. X25if_read_buf_overflow      = $0112;
  176. X25if_read_buf_underflow     = $0113;
  177. X25if_prior_read_pending    = $0114;
  178.  
  179. (* ............................................................................................ *)
  180. (* .                                                                                           . *)
  181. (* .    Write Related                                                                            . *)
  182. (* .                                                                                           . *)
  183. (* ............................................................................................ *)
  184.  
  185. X25if_write_buffer_error       = $0120;
  186. X25if_write_nil_ptr           = $0121;
  187. X25if_write_buf_overflow      = $0122;
  188. X25if_write_buf_underflow     = $0123;
  189. X25if_prior_write_pending    = $0124;
  190.  
  191. (* ............................................................................................ *)
  192. (* .                                                                                           . *)
  193. (* .    In Buffer Related                                                                        . *)
  194. (* .                                                                                           . *)
  195. (* ............................................................................................ *)
  196.  
  197. X25if_in_buffer_error       = $0130;
  198. X25if_in_nil_ptr               = $0131;
  199. X25if_in_buf_overflow          = $0132;
  200. X25if_in_buf_underflow         = $0133;
  201.  
  202. (* ............................................................................................ *)
  203. (* .                                                                                           . *)
  204. (* .    Out Buffer Related                                                                    . *)
  205. (* .                                                                                           . *)
  206. (* ............................................................................................ *)
  207.  
  208. X25if_out_buffer_error       = $0140;
  209. X25if_out_nil_ptr           = $0141;
  210. X25if_out_buf_overflow      = $0142;
  211. X25if_out_buf_underflow     = $0143;
  212.  
  213. (* ............................................................................................ *)
  214. (* .                                                                                           . *)
  215. (* .    Message Header Errors (Read)                                                            . *)
  216. (* .                                                                                           . *)
  217. (* ............................................................................................ *)
  218.  
  219. X25if_header_error             = $0180;
  220. X25if_header_version         = $0181;
  221. X25if_header_underflow         = $0182;    (* status_code = header length                    *)
  222. X25if_unexpected_header         = $0183;    (* status_code = header "Type"                    *)
  223. X25if_unknown_header         = $0184;    (* status_code = header "Type"                    *)
  224.  
  225. (* ............................................................................................ *)
  226. (* .                                                                                           . *)
  227. (* .    X.25 Packet Errors (Read)                                                                . *)
  228. (* .                                                                                           . *)
  229. (* ............................................................................................ *)
  230.  
  231. X25if_packet_error             = $0190;
  232. X25if_packet_overflow         = $0191;    (* status_code = packet length                    *)
  233. X25if_packet_underflow         = $0192;    (* status_code = packet length                    *)
  234. X25if_unexpected_packet     = $0193;    (* status_code = packet type code                *)
  235. X25if_unknown_packet         = $0194;    (* status_code = packet type code                *)
  236.  
  237. (* ............................................................................................ *)
  238. (* .                                                                                           . *)
  239. (* .    X.25 Packet Encode Errors                                                             . *)
  240. (* .                                                                                           . *)
  241. (* ............................................................................................ *)
  242.  
  243. X25if_encode_error            = $0200;
  244. X25if_syntax_error            = $0201;    (* status_code = input buffer offset to error    *)
  245. X25if_overlength_field        = $0202;
  246. X25if_duplicate_facility    = $0208;    (* status_code = input buffer offset to error    *)
  247. X25if_inconsistent_facility    = $0209;    (* status_code = input buffer offset to error    *)
  248.  
  249. (* ............................................................................................ *)
  250. (* .                                                                                           . *)
  251. (* .    X.25 Packet Decode Errors                                                             . *)
  252. (* .                                                                                           . *)
  253. (* ............................................................................................ *)
  254.  
  255. X25if_decode_error            = $0210;
  256.  
  257. (* ............................................................................................ *)
  258. (* .                                                                                           . *)
  259. (* .    X.25 Connect Errors                                                                     . *)
  260. (* .                                                                                           . *)
  261. (* ............................................................................................ *)
  262.  
  263. X25if_X25_Call_error        = $0280;
  264. X25if_call_cleared            = $0281;        (* status_code = clearing cause field         *)
  265.  
  266. (* ............................................................................................ *)
  267. (* .                                                                                           . *)
  268. (* .    X.25 Listen Registration Errors                                                         . *)
  269. (* .                                                                                           . *)
  270. (* ............................................................................................ *)
  271.  
  272. X25if_listen_reg_error        = $0290;        (* status_code = registration error         *)
  273.  
  274. (* ............................................................................................ *)
  275. (* .                                                                                           . *)
  276. (* .    X.25 Listen Registration Refused                                                         . *)
  277. (* .                                                                                           . *)
  278. (* ............................................................................................ *)
  279.  
  280. X25if_listen_reg_refused    = $02A0;        (* status_code = registration error         *)
  281.  
  282. (* ............................................................................................ *)
  283. (* .                                                                                           . *)
  284. (* .    Chooser Access                                                                         . *)
  285. (* .                                                                                           . *)
  286. (* ............................................................................................ *)
  287.  
  288. X25if_chooser_error            = $0300;
  289. X25if_chooser_not_avail        = $0301;
  290. X25if_chooser_nbp_format    = $0308;
  291.  
  292. (* ............................................................................................ *)
  293. (* .                                                                                           . *)
  294. (* .    Black Book Access                                                                     . *)
  295. (* .                                                                                           . *)
  296. (* ............................................................................................ *)
  297.  
  298. X25if_blackbook_error        = $0310;
  299. X25if_blackbook_not_avail    = $0311;
  300. X25if_blackbook_open_err    = $0312;        (* status_code = black book error             *)
  301. X25if_blackbook_access_err    = $0313;        (* status_code = black book error             *)
  302. X25if_blackbook_nbp_format    = $0318;
  303. X25if_blackbook_data_format    = $0319;
  304.  
  305. (* ******************************************************************************************** *)
  306. (* *                                                                                           * *)
  307. (* *    Status Codes ( "status_code" )                                                        * *)
  308. (* *                                                                                           * *)
  309. (* ******************************************************************************************** *)
  310.  
  311. X25if_no_status                = $0000;
  312.  
  313. (* ******************************************************************************************** *)
  314. (* *                                                                                           * *)
  315. (* *    X25_IO_def Flag Field Mask                                                            * *)
  316. (* *                                                                                           * *)
  317. (* ******************************************************************************************** *)
  318.  
  319. IF_asynchronous    =     $8000;            (*     Request Asynchronous Operation            *)
  320. IF_blocking           =    $4000;            (*     Request Blocking Operation                *)
  321. IF_expedited       =    $2000;            (*     Request Expedited Transmission            *)
  322. IF_more            =    $1000;            (*     More data to come                         *)
  323.  
  324. TYPE
  325.  
  326. (* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)
  327. (* +                                                                                           + *)
  328. (* +    Data Manipulation I/O Block (part of Circuit Control Block)                           + *)
  329. (* +                                                                                             + *)
  330. (* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)
  331.  
  332. X25_Data_def    =    PACKED RECORD
  333.     
  334.     max_length    : INTEGER;            (* Max Data Length of Buffer            (bytes) *)
  335.     req_length    : INTEGER;            (* Requested Data Length to Process       (bytes) *)
  336.     act_length    : INTEGER;            (* Actual Data Length Processed         (bytes) *)
  337.     reserved    : INTEGER;            (* Reserved for future use                        *)
  338.     data_ptr    : Ptr;                (* Data Pointer                                    *)
  339.  
  340. END;
  341.  
  342. (* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)
  343. (* +                                                                                           + *)
  344. (* +    Async/Sync I/O Block (part of Circuit Control Block)                                    + *)
  345. (* +                                                                                             + *)
  346. (* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)
  347.  
  348. X25_IO_def    =    PACKED RECORD
  349.  
  350.     return_code    : OSErr;        (* Returned Error Code  (async r/w)             *)
  351.     status_code    : OSErr;        (* Detailed Status Code (async r/w)                *)
  352.     
  353.     completion    : ProcPtr;        (* Completion routine for Asynchronous I/O        *)
  354.     
  355.     timeout        : INTEGER;        (* Timeout value for Synchronous I/O            *)
  356.     
  357.     x25_IO_mask    : INTEGER;        (* Flag Field                                   *)
  358.     
  359.     max_length    : INTEGER;        (* Max Data Length of Buffer            (bytes) *)
  360.     req_length    : INTEGER;        (* Requested Data Length to Transfer       (bytes) *)
  361.     act_length    : INTEGER;        (* Actual Data Length Transfered         (bytes) *)
  362.     reserved    : INTEGER;        (* Reserved for future use                        *)
  363.     data_ptr    : Ptr;            (* Data Pointer                                    *)
  364.  
  365. END;
  366.  
  367. (* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)
  368. (* +                                                                                           + *)
  369. (* +    X.25 Circuit Control Block                                                               + *)
  370. (* +                                                                                             + *)
  371. (* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)
  372.  
  373. tcb_def_ptr    =    ^tcb_def;
  374. tcb_def    =    PACKED RECORD
  375.  
  376.     return_code        : OSErr;            (* Returned Error Code  (non r/w)                       *)
  377.     status_code        : OSErr;            (* Detailed Status Code (non r/w)                        *)
  378.     
  379.     ref_con            : LONGINT;            (* Users Reference (value or pointer)                     *)
  380.  
  381.     in_data            : X25_Data_def;        (* Input Area for Data Manipulation Operations             *)
  382.     out_data        : X25_Data_def;        (* Output Area for Data Manipulation Operations         *)
  383.  
  384.     read_data        : X25_IO_def;        (* Async/Sync Read Area                                   *)
  385.     write_data        : X25_IO_def;        (* Async/Sync Write Area                                   *)
  386.  
  387. (* ............................................................................................ *)
  388. (* .                                                                                           .    *)
  389. (* .                          *** INTERNAL USE ONLY ***                                       . *)
  390. (* .         The following fields are reserved for internal use only and may change           . *)
  391. (* .                                                                                           . *)
  392. (* ............................................................................................ *)
  393.  
  394.     vccb_ref_ptr    : Ptr;            (* Virtual Circuit Control Block pointer                    *)
  395.     tcb_chain_ptr    : tcb_def_ptr;    (* CCB chain pointer                            *)
  396.     users_A5        : LONGINT;        (* Copy of user's A5                                        *)
  397.  
  398. END;
  399.  
  400. (* ******************************************************************************************** *)
  401. (* *                                                                                           * *)
  402. (* *    Values for the useage type parameter of "X25_Open" call                               * *)
  403. (* *                                                                                           * *)
  404. (* ******************************************************************************************** *)
  405.  
  406. useage_type_def        = ( application_type, desk_accessory_type, driver_type );
  407.  
  408. (* ******************************************************************************************** *)
  409. (* *                                                                                           * *)
  410. (* *    Values for the connection_method parameter of "X25_Server_Connect" call               * *)
  411. (* *                                                                                           * *)
  412. (* ******************************************************************************************** *)
  413.  
  414. connection_method_def    = (  connect_via_best, connect_via_ipc, connect_via_adsp );
  415.  
  416. (* ******************************************************************************************** *)
  417. (* *                                                                                           * *)
  418. (* *    X25_Interface Library Functions                                                        * *)
  419. (* *                                                                                           * *)
  420. (* ******************************************************************************************** *)
  421.  
  422.  
  423. FUNCTION X25_Open                ( memory_allocator : ProcPtr; useage_type : useage_type_def ) : OSErr;
  424. FUNCTION X25_Close                : OSErr;
  425.  
  426. FUNCTION X25_vccb_Open            ( tcb : tcb_def_ptr; memory_allocator : ProcPtr; max_packet_size : INTEGER) : OSErr; 
  427. FUNCTION X25_vccb_Close            ( tcb : tcb_def_ptr ) : OSErr;
  428.  
  429. FUNCTION X25_Chooser            ( tcb : tcb_def_ptr ) : OSErr; 
  430. FUNCTION X25_BlackBook            ( tcb : tcb_def_ptr ) : OSErr; 
  431. FUNCTION X25_Set_Server_ID        ( tcb : tcb_def_ptr; server_name_string : Ptr; server_zone_string : Ptr ) : OSErr; 
  432. FUNCTION X25_Get_Server_ID        ( tcb : tcb_def_ptr; server_name_string : Ptr; server_zone_string : Ptr ) : OSErr; 
  433.  
  434. FUNCTION X25_Set_User_ID        ( tcb : tcb_def_ptr; user_name_string : Ptr; user_password_string : Ptr ) : OSErr; 
  435.  
  436. FUNCTION X25_Server_Connect        ( tcb : tcb_def_ptr; connection_method : connection_method_def ) : OSErr; 
  437. FUNCTION X25_Server_Authorize    ( tcb : tcb_def_ptr ) : OSErr; 
  438. FUNCTION X25_Server_Discnct        ( tcb : tcb_def_ptr ) : OSErr; 
  439.  
  440. FUNCTION X25_Read                ( tcb : tcb_def_ptr ) : OSErr; 
  441. FUNCTION X25_Write                ( tcb : tcb_def_ptr ) : OSErr; 
  442. FUNCTION X25_Kill_Read            ( tcb : tcb_def_ptr ) : OSErr; 
  443. FUNCTION X25_Kill_Write            ( tcb : tcb_def_ptr ) : OSErr; 
  444.  
  445. FUNCTION X25_Connect            ( tcb : tcb_def_ptr ) : OSErr; 
  446. FUNCTION X25_Call                ( tcb : tcb_def_ptr ) : OSErr; 
  447. FUNCTION X25_Listen                ( tcb : tcb_def_ptr ) : OSErr; 
  448. FUNCTION X25_Accept                ( tcb : tcb_def_ptr ) : OSErr;
  449. FUNCTION X25_Discnct            ( tcb : tcb_def_ptr ) : OSErr; 
  450.  
  451. FUNCTION X25_encode_call_reg    ( tcb : tcb_def_ptr ) : OSErr; 
  452. FUNCTION X25_encode_call_req    ( tcb : tcb_def_ptr ) : OSErr; 
  453. FUNCTION X25_encode_call_acpt    ( tcb : tcb_def_ptr ) : OSErr;
  454. FUNCTION X25_encode_clear        ( tcb : tcb_def_ptr ) : OSErr;
  455. FUNCTION X25_encode_clear_conf    ( tcb : tcb_def_ptr ) : OSErr;
  456. FUNCTION X25_encode_interrupt    ( tcb : tcb_def_ptr ) : OSErr;
  457. FUNCTION X25_encode_reset        ( tcb : tcb_def_ptr ) : OSErr;
  458. FUNCTION X25_encode_data        ( tcb : tcb_def_ptr ) : OSErr;
  459.  
  460. FUNCTION X25_decode_clear        ( tcb : tcb_def_ptr ) : OSErr;
  461. FUNCTION X25_decode_data        ( tcb : tcb_def_ptr ) : OSErr;
  462.  
  463. FUNCTION X25_Server_Status        ( tcb : tcb_def_ptr ) : OSErr;
  464. FUNCTION X25_Link_Status        ( tcb : tcb_def_ptr ) : OSErr; 
  465. FUNCTION X25_Circuit_Status        ( tcb : tcb_def_ptr ) : OSErr;
  466. FUNCTION X25_msg_header_size     : LONGINT;
  467.  
  468. (* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)
  469. (* +                                                                                           + *)
  470. (* +    End                                                                                    + *)
  471. (* +                                                                                             + *)
  472. (* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)
  473.  
  474. END.